#include "logdbo.h"

// 单例被创建的时候，才会调用构造
// logdbo.cpp
LogDBo::LogDBo() {

}
// 单例析构时，关闭数据库的连接
LogDBo::~LogDBo()
{
    QSqlDatabase::removeDatabase("info_system");
    qDebug() << "单例析构，断开与数据库的连接";
}

// 获取单例
std::shared_ptr<LogDBo> LogDBo::getInstance()
{
    static std::shared_ptr<LogDBo> ins(new LogDBo);                 // 采用静态局部变量的方法，创建单例保证线程安全
    return ins;
}


// 验证用户信息已录取数据库
std::shared_ptr<UserInfo> LogDBo::checkUserInfo(const QString account,const QString username)
{
    // TODO
    auto user = UserInfo::createUser();
    // 查询登录用户的信息是否已经注册
    QSqlQuery sql_select(QSqlDatabase::database("info_system"));
    sql_select.prepare("select account,username,password from tbl_usersInfo where account = ? or username = ?;");
    sql_select.bindValue(0,account);
    sql_select.bindValue(1,username);
    // 执行sql语句
    if(sql_select.exec()){
        qDebug() << "sql_select执行成功";
        // 没有查到
        if(!sql_select.next()){
            qDebug() << "没有该查到用户信息";
            return user;
        }
        // 查到了
        user->account = sql_select.value("account").toString();
        user->username = sql_select.value("username").toString();
        user->password = sql_select.value("password").toString();
        return user;
    }
    else{
        qDebug() << "sql_select执行失败";
        return nullptr; // 执行失败
    }
}

// 注册用户
bool LogDBo::registerUser(const std::shared_ptr<UserInfo> &user)
{
    // 指定sql语句要连接的数据库
    QSqlQuery sql_insert(QSqlDatabase::database("info_system"));
    // 预处理语句
    // 用户ID自增：ALTER TABLE tbl_usersInfo MODIFY user_id INT AUTO_INCREMENT PRIMARY KEY;
    // 但是这次数据库没有用
    sql_insert.prepare("insert into tbl_usersInfo (username,account,password,register_time) values(:name,:account,:password,NOW());");
    // 绑定值
    sql_insert.bindValue(":name",user->username);
    sql_insert.bindValue(":account",user->account);
    sql_insert.bindValue(":password",user->password);
    // 执行语
    if(sql_insert.exec()){
        qDebug() << "sql_insert执行成功";
        return true;
    }
    else{
        qDebug() << "sql_insert执行失败";
        return false;
    }
}


